package com.alex.statistics.controller;

import com.alex.statistics.config.FilePathConfig;
import com.alex.statistics.global.DynamicExcelToJsonConverter;
import com.alex.statistics.pojo.Result;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.json.JSONArray;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;


@RestController
@Tag(name = "获取数据", description = "获取数据，包含上传自定义数据")
@RequestMapping("/data")
public class DataController {
    private static final ObjectMapper objectMapper = new ObjectMapper();
    @Autowired
    private FilePathConfig filePathConfig;


    /**
     * 根据id获取对应的Excel样例数据，并转换为JSON返回
     *
     * @param id Excel样例数据的唯一标识（对应配置中的key）
     * @return 包含Excel数据的JSON节点
     * @throws IOException 当文件读取或转换失败时抛出
     */
    @GetMapping("getExcel/{type}")

    @Operation(
            summary = "获取Excel样例数据并转换为JSON",
            description = "correlation - 相关性聚类样例数据<br>" +
                    "density - 密度聚类样例数据<br>" +
                    "hierarchical - 层次聚类样例数据<br>" +
                    "kmeans - K-means聚类样例数据<br>" +
                    "central-tendency - 集中趋势分析样例数据<br>" +
                    "dispersion - 离散程度分析样例数据<br>" +
                    "distribution - 分布分析样例数据<br>" +
                    "dbscan - DBSCAN聚类样例数据<br>" +
                    "variable-relation - 变量关系分析样例数据<br>" +
                    "zscore - Z-score分析样例数据<br>" +
                    "custom-rule - 自定义规则分组样例数据<br>" +
                    "equal-interval - 等间隔分组样例数据<br>" +
                    "natural-breaks - 自然断点分组样例数据<br>" +
                    "quantile - 分位数分组样例数据<br>" +
                    "composition-ratio - 构成比分析样例数据<br>" +
                    "contribution - 贡献度分析样例数据<br>" +
                    "pareto - 帕累托分析样例数据<br>" +
                    "proportion - 占比分析样例数据<br>" +
                    "structure-change - 结构变化分析样例数据<br>" +
                    "exponential-smoothing - 指数平滑分析样例数据<br>" +
                    "linear-regression - 线性回归分析样例数据<br>" +
                    "moving-average - 移动平均分析样例数据<br>" +
                    "polynomial-fit - 多项式拟合分析样例数据"
    )
    public Result<JsonNode> getData(
            @PathVariable String type) throws IOException {

        String filePath = getSampleFilePath(type);
        // 读取文件内容
        String jsonStr = DynamicExcelToJsonConverter.convertExcelToJson(filePath, 8);
        JsonNode jsonNode = objectMapper.readTree(jsonStr);

        return Result.ok(jsonNode);
    }


    @Operation(summary = "上传Excel文件并转换为JSON数据")

    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public Result<JsonNode> uploadExcel(@ApiParam(value = "Excel文件（支持xls、xlsx）", required = true) @RequestParam("file") MultipartFile file) {

        // 验证文件是否为空
        if (file.isEmpty()) {
            throw new IllegalArgumentException("上传文件不能为空");
        }

        // 验证文件格式
        String fileName = file.getOriginalFilename();
        if (!isValidExcelFormat(fileName)) {
            throw new IllegalArgumentException("不支持的文件格式，仅支持xls、xlsx");
        }

        try (InputStream inputStream = file.getInputStream()) {
            // 调用转换工具类处理文件
            String jsonStr = DynamicExcelToJsonConverter.convertExcelToJson(inputStream, 8);
            // 转换为JsonNode返回（保持原始结构）
            JsonNode jsonNode = objectMapper.readTree(jsonStr);

            return Result.ok(jsonNode);

        } catch (IllegalArgumentException e) {
            // 处理业务异常（如表头为空）
            throw new IllegalArgumentException(e.getMessage());
        } catch (IOException e) {
            // 处理文件读取/解析异常
            throw new IllegalArgumentException("文件处理失败：" + e.getMessage());
        }
    }

    /**
     * 验证是否为合法的Excel格式
     */
    private boolean isValidExcelFormat(String fileName) {
        if (fileName == null || !fileName.contains(".")) {
            return false;
        }
        String extension = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
        return "xls".equals(extension) || "xlsx".equals(extension);
    }


    /**
     * 根据key查询XLS文件的完整目录
     *
     * @param key 配置中的key（如"correlation"、"kmeans"）
     * @return 完整文件路径或错误信息
     */

    private String getSampleFilePath(@RequestParam String key) {
        // 1. 获取配置的基础目录和相对路径
        String baseDir = filePathConfig.getBase();
        Map<String, String> fileMap = filePathConfig.getFile_map();
        String relativePath = fileMap.get(key);
        if (relativePath == null) {
            return null;
        }
        Path fullPath = Paths.get(baseDir).resolve(relativePath);
        return fullPath.toString();
    }
}
